home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1998 #4 / Amiga Plus CD - 1998 - No. 4.iso / pd / disk / image2disk / image2disk.s < prev    next >
Text File  |  1998-02-18  |  31KB  |  1,002 lines

  1. *****************************************************************************
  2. *                                        *
  3. *    PROGRAM: Image2Disk                            *
  4. *    VERSION: 1.0                                *
  5. *   SOURCE CODE: 7                                *
  6. *       DATE: 13.01. - 20.01.1998                        *
  7. *      LANGUAGE: Assembler (DevPac V3.14)                    *
  8. *     SYSTEM: A1200    KS 40.68 WB 40.42 2MB chip 8MB fast 68030/50mhz        *
  9. *                                        *
  10. *     AUTHOR: Joerg Riemer 14167 Berlin/SchottmuellerStr.107/Germany        *
  11. *      EMAIL: mission@cs.tu-berlin.de                    *
  12. *                                        *
  13. *    COMMENT: there are two assembler conditions.                *
  14. *                                        *
  15. *         1.) BSS_Section: To get a shorter File, don't assemble        *
  16. *         with BSS-section. Use StripHunk instead to generate        *
  17. *         a Code_BSS-segment. it spares some bytes! but for        *
  18. *         anybody don't know what this means: "leave it as it is"    *
  19. *                                         *
  20. *         StripHunk is available at AmiNet dev/misc/...            *
  21. *                                        *
  22. *         2.) Verify_On: image2disk has an option to verify        *
  23. *         written tracks when using [image --> disk]. if            *
  24. *         this condition is set, track-verifying will be            *
  25. *         executed by default. otherwise the flag must be        *
  26. *         set by user.                            *
  27. *                                        *
  28. *         for suggestions, hints/tips, and/or questions            *
  29. *         send an email to: mission@cs.tu-berlin.de            *
  30. *                                        *
  31. *****************************************************************************
  32.  
  33. BSS_Section        set    1
  34. Verify_On        set    0
  35.  
  36. *****************************************************************************
  37.  
  38.     output    ram:Image2Disk
  39.  
  40. ************************************************ exec definitions ***********
  41.  
  42. _LVOWaitPort        equ    -384
  43. _LVOGetMsg        equ    -372
  44. _LVOForbid        equ    -132
  45. _LVOReplyMsg        equ    -378
  46. _LVOOpenLibrary        equ    -552
  47. _LVOCloseLibrary    equ    -414
  48. _LVOOpenDevice        equ    -444
  49. _LVOCloseDevice        equ    -450
  50. _LVODoIO        equ    -456
  51. _LVOCreateIORequest    equ    -654
  52. _LVODeleteIORequest    equ    -660
  53. _LVOCreateMsgPort    equ    -666
  54. _LVODeleteMsgPort    equ    -672
  55.  
  56. pr_CLI            equ    $0AC
  57. pr_MsgPort        equ    $05C
  58.  
  59. IOSTD_SIZE        equ    $030
  60.  
  61. ************************************************ dos definitions ************
  62.  
  63. _LVOOpen        equ    -030
  64. _LVOClose        equ    -036
  65. _LVORead        equ    -042
  66. _LVOWrite        equ    -048
  67. _LVOSeek        equ    -066
  68. _LVODeleteFile        equ    -072
  69. _LVOLock        equ    -084
  70. _LVOUnLock        equ    -090
  71. _LVOCurrentDir        equ    -126
  72. _LVOLockDosList        equ    -654
  73. _LVOUnLockDosList    equ    -660
  74. _LVOFindDosEntry    equ    -684
  75. _LVOInhibit        equ    -726
  76.  
  77. OFFSET_END        equ     001
  78. OFFSET_BEGINNING    equ    -001
  79. ACCESS_READ        equ    -002
  80.  
  81. LDF_READ        equ    $001
  82. LDF_DEVICES        equ    $004
  83.  
  84. MODE_NEWFILE        equ    $3EE
  85. MODE_OLDFILE        equ    $3ED
  86.  
  87. ************************************************ reqtools definitions *******
  88.  
  89. _LVOrtAllocRequestA    equ    -030
  90. _LVOrtFreeRequest    equ    -036
  91. _LVOrtChangeReqAttrA    equ    -048
  92. _LVOrtFileRequestA    equ    -054
  93. _LVOrtEZRequestA    equ    -066
  94.  
  95.  
  96. EZREQF_NORETURNKEY    equ    $001
  97. EZREQF_CENTERTEXT    equ    $004
  98. FREQF_PATGAD        equ    $010
  99. FREQF_SAVE        equ    $002
  100.  
  101. rtfi_Dir        equ    $010
  102.  
  103. RT_TagBase        equ    $80000000
  104.  
  105. RTEZ_ReqTitle        equ    RT_TagBase+20
  106. RTEZ_Flags        equ    RT_TagBase+22
  107.  
  108. RTFI_Flags        equ    RT_TagBase+40
  109. RTFI_Dir        equ    RT_TagBase+50
  110. RTFI_MatchPat        equ    RT_TagBase+51
  111.  
  112. ************************************************ bss datas ******************
  113.  
  114. WBMsg        rs.l    1            ;workbench message
  115. DOSBase        rs.l    1            ;ptr. base of dos
  116. REQBase        rs.l    1            ;ptr. base of reqtools
  117. RCode        rs.l    1            ;buffer for returncode
  118. DLock        rs.l    1            ;buffer (returned dir.-lock)
  119. FLock        rs.l    1            ;buffer (opened file_lock)
  120. ToDo        rs.l    1            ;ptr. (subroutine to do)
  121. TList        rs.l    1            ;ptr. taglist
  122. ReqTitle    rs.l    1            ;ptr. (title for filereq.)
  123. MessagePort    rs.l    1            ;ptr. msgport for doio()
  124. IORequest    rs.l    1            ;ptr. iorequest for doio()
  125.  
  126. FReqBase    rs.l    1            ;ptr. (base of filerequester)
  127. ArgArray1    rs.l    1            ;reqtools argarray
  128. ArgArray2    rs.l    0            ;ptr. to devicename
  129. Device        rs.l    1            ;sometimes used for argarray
  130. FileName    rs.b    108            :room for filename
  131.  
  132. EFlag        rs.b    1            ;error flag
  133. DriveNum    rs.b    1            ;buffer (unit number)
  134. DriveChr    rs.b    1            ;buffer for "D","F","H","V"
  135. RWSwitch    rs.b    1            ;flag (read or write track)
  136.  
  137. VFlag        rs.b    1            ;verify-switch
  138.         rs.b    1            ;unused (for longword align)
  139.         rs.b    1            ;unused (for longword align)
  140.         rs.b    1            ;unused (for longword align)
  141.  
  142. TrackBuffer1    rs.b    512*11*2        ;for read/write tracks
  143. TrackBuffer2    rs.b    512*11*2        ;for verify written tracks
  144.  
  145. BSS_Size    rs.b    0            ;bss_size overall
  146.  
  147. OneTrack    set    BSS_Size-TrackBuffer2    ;standard track_size
  148.  
  149. ************************************************ workbench startup **********
  150.  
  151. Start        movem.l    D1-D7/A0-A6,-(SP)    ;save registers
  152.  
  153.         if    BSS_Section        ;check assembler condition
  154.  
  155.         movea.l    Start-4(pc),A5        ;get bss_section
  156.         addq.l    #1,A5            ;skip pointer (next segment)
  157.         adda.l    A5,A5            ;convert bpcl_pointer
  158.         adda.l    A5,A5            ;to real_address
  159.  
  160.         elseif                ;otherwise
  161.  
  162.         lea    DataBase(pc),A5        ;set working area
  163.  
  164.         endc                ;end condition
  165.  
  166. *****************************************************************************
  167.  
  168.         movea.l    4.w,A6            ;set execbase
  169.         movea.l    $114(A6),A2        ;find own task
  170.         tst.l    pr_CLI(A2)        ;we are from cli?
  171.         bne.b    FromCLI            ;branch if so
  172.  
  173.         lea    pr_MsgPort(A2),A0    ;set message port
  174.         jsr    _LVOWaitPort(A6)    ;wait for
  175.         lea    pr_MsgPort(A2),A0    ;set message port
  176.         jsr    _LVOGetMsg(A6)        ;get wb_message
  177.         move.l    D0,(A5)            ;and save for later return
  178.  
  179. *****************************************************************************
  180.  
  181. FromCLI        bsr.b    OpenLibs
  182.  
  183. *****************************************************************************
  184.  
  185.         tst.l    (A5)            ;launched from wb?
  186.         beq.b    ExitDOS            ;branch if not
  187.  
  188.         movea.l    4.w,A6            ;set execbase
  189.         jsr    _LVOForbid(A6)        ;use exec to (forbid) tasks
  190.         movea.l    (A5),A1            ;set wb_message
  191.         jsr    _LVOReplyMsg(A6)    ;use EXEC to (replymsg)
  192.  
  193. ExitDOS        move.l    RCode(A5),D0        ;set returncode
  194.         movem.l    (SP)+,D1-D7/A0-A6    ;restore registers
  195.         rts                ;go back (shell/wb)
  196.  
  197. *****************************************************************************
  198.  
  199. version    dc.b "$VER: image2disk 1.0 (20.1.98) by joerg riemer jan'98",0
  200.  
  201. ************************************************ open libraries *************
  202.  
  203. OpenLibs    moveq    #20,D0            ;preset returncode
  204.         move.l    D0,RCode(A5)        ;20 - library not found!
  205.  
  206.         moveq    #37,D0            ;required library version
  207.         lea    DOSName(pc),A1        ;set library name
  208.         jsr    _LVOOpenLibrary(A6)    ;use EXEC to (openlibrary)
  209.         move.l    D0,DOSBase(A5)        ;save base
  210.  
  211.         beq.b    CloseLibs        ;branch if not open
  212.  
  213.         moveq    #38,D0            ;required library version
  214.         lea    REQName(pc),A1        ;set library name
  215.         jsr    _LVOOpenLibrary(A6)    ;use EXEC to (openlibrary)
  216.         move.l    D0,REQBase(A5)        ;save base
  217.  
  218.         beq.b    CloseLibs        ;branch if not open
  219.  
  220. *****************************************************************************
  221.  
  222.         bsr.b    Main
  223.  
  224. ************************************************ close libraries ************
  225.  
  226. CloseLibs    movea.l    4.w,A6            ;set EXEC to call a function
  227.  
  228.         move.l    REQBase(A5),D1        ;get base_ptr
  229.         beq.b    CloseDOS        ;branch when not open
  230.         movea.l    D1,A1            ;set base_ptr
  231.         jsr    _LVOCloseLibrary(A6)    ;use EXEC to (closelibrary)
  232.  
  233. CloseDOS    move.l    DOSBase(A5),D1        ;get base_ptr
  234.         beq.b    QuitClose        ;branch when not open
  235.         movea.l    D1,A1            ;set base_ptr
  236.         jsr    _LVOCloseLibrary(A6)    ;use EXEC to (closelibrary)
  237.  
  238. QuitClose    rts                ;back to DOS
  239.  
  240. *****************************************************************************
  241.  
  242. DOSName        dc.b    "dos.library",0
  243. REQName        dc.b    "reqtools.library",0,0
  244.  
  245. *****************************************************************************
  246.  
  247. Main        moveq    #0,D0            ;preset returncode
  248.         move.l    D0,RCode(A5)        ;00 - everything ok!
  249.  
  250.         bsr    AllocReq        ;allocate file_requester
  251.         bsr    InitReq            ;change some attributes
  252.         bsr.b    SetDevChr        ;set device_characters
  253.  
  254. ************************************************
  255.  
  256.         if    Verify_On        ;check assembler condition
  257.         bsr.b    Verify            ;verify -> default = vflag on
  258.         elseif                ;otherwise
  259.         bsr.b    Loop            ;loop -> default = vflag off
  260.         endc                ;end condition
  261.  
  262. ************************************************
  263.  
  264.         bsr    FreeReq            ;free file_requester
  265.         rts                ;go back
  266.  
  267. ************************************************ edit main requester text ***
  268.  
  269. SetDevChr    moveq    #3,D0            ;set loop_counter
  270.         lea    ChrTable(pc),A0        ;set character table
  271.         lea    Text22(pc),A1        ;set text to edit
  272. SetChr        move.l    D0,D1            ;prepare text_offset
  273.         lsl    #3,D1            ;prepare text_offset
  274.         add    D0,D1            ;prepare text_offset
  275.         move.b    1(A0,D0.w),(A1,D1.w)    ;edit requester text
  276.         dbra    D0,SetChr        ;do it 4 times
  277.         rts                ;go back
  278.  
  279. *****************************************************************************
  280.  
  281. ChrTable    dc.b    0,"DFHV",0        ;device_characters
  282.  
  283. *****************************************************************************
  284.  
  285. Verify        eor.b    #$1,VFlag(A5)        ;change verify_flag
  286.         lea    Text13(pc),A0        ;get text
  287.         eor.b    #$A,$A(A0)        ;change text also
  288.  
  289. *********************** print main request *****
  290.  
  291. Loop        lea    TList1(pc),A0        ;set taglist
  292.         lea    Text12(pc),A1        ;set requester_text
  293.         lea    Text13(pc),A2        ;set gadget_text
  294.         bsr    REQuest0        ;and request by reqtools
  295.         tst.b    D0            ;test for [quit] by user
  296.         beq    Quit            ;branch if so
  297.  
  298.         subq    #1,D0            ;check for verify
  299.         beq.b    Verify            ;branch if so
  300.  
  301.         lea    ReadFile(pc),A0        ;get read file / write disk
  302.         lea    TList3(pc),A1        ;get filerequester taglist
  303.         lea    Text03(pc),A2        ;get filerequester title
  304.  
  305.         subq    #1,D0            ;want to write a disk?
  306.         sne    RWSwitch(A5)        ;set switch (read or write)
  307.         beq.b    SetToDo            ;branch if so
  308.  
  309.         lea    WriteFile(pc),A0    ;get write file / read disk
  310.         lea    TList4(pc),A1        ;get filerequester taglist
  311.         lea    Text04(pc),A2        ;get filerequester title
  312.  
  313. SetToDo        move.l    A0,ToDo(A5)        ;save jump_in
  314.         move.l    A1,TList(A5)        ;save taglist
  315.         move.l    A2,ReqTitle(A5)        ;save title
  316.  
  317. *********************** ask for device *********
  318.  
  319.         lea    TList1(pc),A0        ;set taglist
  320.         lea    Text21(pc),A1        ;set requester_text
  321.         lea    Text22(pc),A2        ;set gadget_text
  322.         bsr    REQuest0        ;and request by reqtools
  323.  
  324.         move.b    ChrTable(pc,D0),DriveChr(A5)    ;get drive_character
  325.         beq.b    Loop                ;branch if canceled
  326.  
  327.         lea    Device1(pc),A0        ;get fmsdisk.device
  328.  
  329.         subq    #1,D0            ;check for trackdisk
  330.         bne.b    SetDevice        ;or fmsdisk.device
  331.  
  332.         lea    Device0(pc),A0        ;get trackdisk.device
  333.  
  334. SetDevice    move.l    A0,Device(A5)        ;save devicename
  335.  
  336. *********************** ask for unit ***********
  337.  
  338.         lea    Text24(pc),A2        ;set gadget_text
  339.  
  340.         moveq    #3,D0            ;set loop_counter
  341. SetChar        move.l    D0,D1            ;prepare offset
  342.         lsl.l    #2,D1            ;prepare offset
  343.         move.b    DriveChr(A5),(A2,D1.W)    ;edit text
  344.         dbra    D0,SetChar        ;do it 4 times
  345.  
  346.         lea    TList1(pc),A0        ;set taglist
  347.         lea    Text23(pc),A1        ;set requester_text
  348.         bsr    REQuest0        ;ask user for drive_number
  349.         subq    #1,D0            ;prepare drive_number
  350.         bmi    Loop            ;branch if canceled
  351.  
  352.         move.b    D0,DriveNum(A5)        ;save drive_number
  353.  
  354.         lea    Text99(pc),A0        ;get text to prepare
  355.         move.b    DriveChr(A5),(A0)    ;edit text
  356.         addi.b    #$30,D0            ;drive_number -> ASCII
  357.         move.b    D0,2(A0)        ;edit text
  358.  
  359. ************************************************
  360.  
  361.         st    EFlag(A5)        ;preset error_flag
  362.  
  363.         moveq    #0,D0            ;preset returncode
  364.         move.l    D0,RCode(A5)        ;00 - everything ok!
  365.  
  366. ************************************************
  367.  
  368.         bsr.b    CreateIOReq        ;create msgport/iorequest
  369.         bsr    OpenDevice        ;open required device
  370.         bsr    GetFileName        ;get image_filename
  371.         bsr    GetCDir            ;change currentdir
  372.  
  373.         movea.l    ToDo(A5),A0        ;get subroutine
  374.         jsr    (A0)            ;read disk / write disk
  375.  
  376.         bsr    ResetCDir        ;restore previous path
  377. ReqFail0    bsr    CloseDevice        ;close track./fmsdisk.device
  378. ReqFail1    bsr.b    DeleteIOReq        ;remove iorequest/msgport
  379.  
  380. ************************************************
  381.  
  382. ReqFail2    lea    Text94(pc),A4        ;set insert = successful
  383.  
  384.         tst.b    EFlag(A5)        ;test error_flag
  385.         beq.b    .Ready            ;branch if ok
  386.  
  387.         lea    Text96(pc),A4        ;set insert = canceled
  388.  
  389.         tst.l    RCode(A5)        ;test returncode
  390.         beq.b    .Ready            ;branch if ok
  391.  
  392.         lea    Text95(pc),A4        ;set insert = failed
  393.  
  394. .Ready        move.l    A4,ArgArray1(A5)    ;save ptr.
  395.         lea    ArgArray1(A5),A4    ;set argarray
  396.  
  397.         lea    TList0(pc),A0        ;set taglist
  398.         lea    Text41(pc),A1        ;set requester_text
  399.         lea    Text42(pc),A2        ;set gadget_text
  400.         bsr    REQuest0        ;ask user for [quit]
  401.         tst.b    D0            ;another image_transfer?
  402.         bne    Loop            ;branch if so
  403.  
  404. Quit        rts                ;else, go back (quit program)
  405.  
  406. ************************************************ create msgeport/iorequest **
  407.  
  408. CreateIOReq    movea.l    4.w,A6            ;set EXEC to use a function
  409.         jsr    _LVOCreateMsgPort(A6)    ;use EXEC to (createport)
  410.         move.l    D0,MessagePort(A5)    ;save ptr.
  411.         beq    Error09            ;branch when failed
  412.  
  413.         moveq    #IOSTD_SIZE,D0        ;iorequest size
  414.         movea.l    MessagePort(A5),A0    ;set msgport
  415.         jsr    _LVOCreateIORequest(A6)    ;use EXEC to (createrequest)
  416.         move.l    D0,IORequest(A5)    ;save ptr.
  417.         beq    Error10            ;branch when failed
  418.         rts                ;go back
  419.  
  420. ************************************************ delete iorequest/msgport ***
  421.  
  422. DeleteIOReq    movea.l    4.w,A6            ;set EXEC to use a function
  423.  
  424.         movea.l    IORequest(A5),A0    ;set iorequest
  425.         jsr    _LVODeleteIORequest(A6)    ;use EXEC to (deleterequest)
  426.  
  427.         movea.l    MessagePort(A5),A0    ;set msgport
  428.         jsr    _LVODeleteMsgPort(A6)    ;use EXEC to (deletemsgport)
  429.         rts                ;go back
  430.  
  431. ************************************************ finddosentry / opendevice **
  432.  
  433. OpenDevice    moveq    #5,D1            ;flags (ldf_devices|ldf_read)
  434.         movea.l    DOSBase(A5),A6        ;set DOS to call a function
  435.         jsr    _LVOLockDosList(A6)    ;use DOS to (lockdoslist)
  436.  
  437.         move.l    D0,D1            ;set dlist
  438.         lea    Text99(pc),A2        ;get drivename
  439.         move.b    #0,3(A2)        ;prepare drivename
  440.         move.l    A2,D2            ;set drivename
  441.         moveq    #LDF_DEVICES,D3        ;control flag (devices only)
  442.         jsr    _LVOFindDosEntry(A6)    ;use DOS to (finddosentry)
  443.  
  444.         move.l    D0,D2            ;save entry
  445.         move.b    #":",3(A2)        ;reset drivename
  446.  
  447.         moveq    #5,D1            ;flags (ldf_devices|ldf_read)
  448.         jsr    _LVOUnLockDosList(A6)    ;use DOS to (unlockdoslist)
  449.  
  450.         tst.l    D2            ;device_node found ?
  451.         beq    Error11            ;branch if not
  452.  
  453. *********************** compare devicename *****
  454.  
  455.         movea.l    D2,A2            ;set node
  456.         movea.l    $1C(A2),A2        ;get dn_startup
  457.         adda.l    A2,A2            ;convert bcpl_ptr.
  458.         adda.l    A2,A2            ;to real address
  459.         movea.l    4(A2),A0        ;get fssm_device
  460.         adda.l    A0,A0            ;convert bcpl_ptr.
  461.         adda.l    A0,A0            ;to real address
  462.         move.b    (A0)+,D0        ;set string_length
  463.         ext.w    D0            ;prepare loop_counter
  464.         subq    #1,D0            ;prepare loop_counter
  465.         movea.l    Device(A5),A1        ;set expected device
  466. CheckDevice    cmpm.b    (A0)+,(A1)+        ;compare device_name
  467.         bne    Error12            ;branch on error
  468.         dbra    D0,CheckDevice        ;do for all characters
  469.  
  470. *********************** check drive geometry ***
  471.  
  472.         lea    DriveGeometry(pc),A0    ;get drive geometry
  473.         movea.l    8(A2),A1        ;get fssm_environ
  474.         adda.l    A1,A1            ;convert bcpl_ptr.
  475.         adda.l    A1,A1            ;to real address
  476.         move.l    (A0)+,D0        ;get bytes per block
  477.         cmp.l    $04(A1),D0        ;check for
  478.         bne    Error13            ;branch if not equal
  479.         move.l    (A0)+,D0        ;get surfaces
  480.         cmp.l    $0C(A1),D0        ;check for
  481.         bne    Error13            ;branch if not equal
  482.         move.l    (A0)+,D0        ;get blocks per track
  483.         cmp.l    $14(A1),D0        ;check for
  484.         bne    Error13            ;branch if not equal
  485.         move.l    (A0)+,D0        ;get first track
  486.         cmp.l    $24(A1),D0        ;check for
  487.         bne    Error13            ;branch if not equal
  488.         move.l    (A0)+,D0        ;get last track
  489.         cmp.l    $28(A1),D0        ;check for
  490.         bne    Error13            ;branch if not equal
  491.  
  492. *********************** open device ************
  493.  
  494.         moveq    #0,D0            ;prepare register
  495.         moveq    #0,D1            ;set flags
  496.         move.b    DriveNum(A5),D0        ;set drive_number
  497.         movea.l    Device(A5),A0        ;set devicename
  498.         movea.l    IORequest(A5),A1    ;set iorequest
  499.         movea.l    4.w,A6            ;set EXEC to call a function
  500.         jsr    _LVOOpenDevice(A6)    ;use EXEC to (opendevice)
  501.         tst.l    D0            ;everything ok?
  502.         bne    Error05            ;branch if not
  503.         rts                ;go back
  504.  
  505. *****************************************************************************
  506.  
  507. DriveGeometry    dc.l    $00000080        ;longs per block
  508.         dc.l    $00000002        ;surfaces per disk
  509.         dc.l    $0000000B        ;blocks per track
  510.         dc.l    $00000000        ;first cylinder
  511.         dc.l    $0000004F        ;last cylinder
  512.  
  513. ************************************************ close device / remove port *
  514.  
  515. CloseDevice    movea.l    4.w,A6            ;set EXEC to call a function
  516.         movea.l    IORequest(A5),A1    ;set iorequest
  517.         jsr    _LVOCloseDevice(A6)    ;use EXEC to (closedevice)
  518.         rts                ;go back
  519.  
  520. ************************************************ read disk / write image ****
  521.  
  522. WriteFile    lea    FileName(A5),A1        ;get filename
  523.         move.l    A1,D1            ;set filename
  524.         move.l    #MODE_NEWFILE,D2    ;set options
  525.         movea.l    DOSBase(A5),A6        ;set DOS to call a function
  526.         jsr    _LVOOpen(A6)        ;use DOS to (open) file
  527.         move.l    D0,FLock(A5)        ;save lock
  528.         beq    Error06            ;branch when failed
  529.  
  530. *********************** read tracks ************
  531.  
  532.         bsr    Inhibit            ;inhibit drive
  533.         bsr    REQInsert        ;request (insert disk)
  534.  
  535.         move.l    #OneTrack,D5        ;set track length
  536.         moveq    #00000000,D6        ;prepare track_offset
  537.  
  538.         moveq    #79,D7            ;prepare loop_counter
  539.  
  540. ReadTracks    lea    TrackBuffer1(A5),A2    ;get track_buffer
  541.         movea.l    IORequest(A5),A1    ;get io_request
  542.         move.w    #2,$1C(A1)        ;set io_command (cmd_read)
  543.         move.l    D5,$24(A1)        ;set io_length
  544.         move.l    A2,$28(A1)        ;set buffer
  545.         move.l    D6,$2C(A1)        ;set track_offset
  546.  
  547.         movea.l    4.w,A6            ;set EXEC to call a function
  548.         jsr    _LVODoIO(A6)        ;use EXEC for (doio)
  549.         tst.l    D0            ;check for success
  550.         bne    Error07            ;branch if not
  551.  
  552.         move.l    FLock(A5),D1        ;set file_lock
  553.         move.l    A2,D2            ;set buffer
  554.         move.l    D5,D3            ;set length to write
  555.         movea.l    DOSBase(A5),A6        ;set DOS to call a function
  556.         jsr    _LVOWrite(A6)        ;use DOS to (write) bytes
  557.         cmp.l    D0,D3            ;something wrong?
  558.         bne    Error08            ;branch if so
  559.  
  560.         add.l    D5,D6            ;add track
  561.         dbra    D7,ReadTracks        ;and do the next one
  562.  
  563.         sf    EFlag(A5)        ;clear error_flag (ok)
  564.  
  565.         bra    InitDrive        ;close file / reset drive
  566.  
  567. ************************************************ read image / write disk ****
  568.  
  569. ReadFile    lea    FileName(A5),A1        ;get filename
  570.         move.l    A1,D1            ;set filename
  571.         move.l    #MODE_OLDFILE,D2    ;set options
  572.         movea.l    DOSBase(A5),A6        ;set DOS to call a function
  573.         jsr    _LVOOpen(A6)        ;use DOS to (open) file
  574.         move.l    D0,FLock(A5)        ;save lock
  575.         beq    Error00            ;branch if not found
  576.  
  577.         move.l    FLock(A5),D1        ;set file_lock
  578.         moveq    #0,D2            ;set position
  579.         moveq    #OFFSET_END,D3        ;set mode
  580.         jsr    _LVOSeek(A6)        ;use DOS to (seek) in file
  581.  
  582.         move.l    FLock(A5),D1        ;set file_lock
  583.         moveq    #0,D2            ;set position
  584.         moveq    #OFFSET_BEGINNING,D3    ;set mode
  585.         jsr    _LVOSeek(A6)        ;use DOS to (seek) in file
  586.  
  587.         cmpi.l    #$DC000,D0        ;must be the file_length!!
  588.         bne    Error01            ;branch if not
  589.  
  590. ************************ write tracks **********
  591.  
  592.         bsr    Inhibit            ;inhibit drive
  593.         bsr    REQInsert        ;request (insert disk)
  594.  
  595.         move.l    #OneTrack,D5        ;set track length
  596.         moveq    #00000000,D6        ;prepare track_offset
  597.  
  598.         moveq    #79,D7            ;prepare loop_counter
  599.  
  600. WriteTracks    lea    TrackBuffer1(A5),A2    ;get track_buffer
  601.         move.l    FLock(A5),D1        ;set file_lock
  602.         move.l    A2,D2            ;set buffer
  603.         move.l    D5,D3            ;set length to read
  604.         movea.l    DOSBase(A5),A6        ;set DOS to call a function
  605.         jsr    _LVORead(A6)        ;use DOS to (read) some bytes
  606.         cmp.l    D0,D3            ;something wrong?
  607.         bne    Error02            ;branch if so
  608.  
  609.         movea.l    IORequest(A5),A1    ;get io_request
  610.         move.w    #$B,$1C(A1)        ;set io_command (cmd_format)
  611.         move.l    D5,$24(A1)        ;set io_length
  612.         move.l    A2,$28(A1)        ;set buffer
  613.         move.l    D6,$2C(A1)        ;set track_offset
  614.  
  615.         movea.l    4.w,A6            ;set EXEC to call a function
  616.         jsr    _LVODoIO(A6)        ;use EXEC for (doio)
  617.         tst.l    D0            ;check for success
  618.         bne    Error03            ;branch if not
  619.  
  620. ************************ verify track **********
  621.  
  622.         tst.b    VFlag(A5)        ;want to verify ?
  623.         beq.b    WriteNext        ;branch if not
  624.  
  625.         lea    TrackBuffer2(A5),A2    ;get track_buffer
  626.         movea.l    IORequest(A5),A1    ;get io_request
  627.         move.w    #2,$1C(A1)        ;set io_command (cmd_read)
  628.         move.l    D5,$24(A1)        ;set io_length
  629.         move.l    A2,$28(A1)        ;set buffer
  630.         move.l    D6,$2C(A1)        ;set track_offset
  631.  
  632.         movea.l    4.w,A6            ;set EXEC to call a function
  633.         jsr    _LVODoIO(A6)        ;use EXEC for (doio)
  634.         tst.l    D0            ;check for success
  635.         bne    Error04            ;branch if not
  636.  
  637.         lea    TrackBuffer1(A5),A0    ;get track_buffer
  638.         lea    TrackBuffer2(A5),A1    ;get track_buffer
  639.         move.l    #OneTrack/4-1,D0    ;set loop_counter
  640. VerifyTrack    cmpm.l    (A0)+,(A1)+        ;compare buffers
  641.         bne    Error04            ;branch if fails
  642.         dbra    D0,VerifyTrack        ;do it sometimes
  643.  
  644. ************************************************
  645.  
  646. WriteNext    add.l    D5,D6            ;add track
  647.         dbra    D7,WriteTracks        ;and do the next one
  648.  
  649.         sf    EFlag(A5)        ;clear error_flag (ok)
  650.  
  651. ************************************************ init. drive / close file ***
  652.  
  653. InitDrive    lea    Text99(pc),A1        ;get drive
  654.         move.l    A1,D1            ;set drive
  655.         moveq    #0,D2            ;set flag (uninhibit)
  656.         movea.l    DOSBase(A5),A6        ;set DOS to call a function
  657.         jsr    _LVOInhibit(A6)        ;use DOS to (inhibit)
  658.  
  659. ************************************************
  660.  
  661. CloseFile    move.l    FLock(A5),D1        ;set file_lock
  662.         movea.l    DOSBase(A5),A6        ;set DOS to call a function
  663.         jsr    _LVOClose(A6)        ;use DOS to (close) file
  664.  
  665. ************************************************
  666.  
  667.         tst.b    RWSwitch(A5)        ;read file ?
  668.         beq.b    .Ready            ;branch if so
  669.         tst.b    EFlag(A5)        ;test for error
  670.         beq.b    .Ready            ;branch if not
  671.  
  672.         lea    FileName(A5),A1        ;get filename
  673.         move.l    A1,D1            ;set filename
  674.         jsr    _LVODeleteFile(A6)    ;use DOS to (deletefile)
  675.  
  676. ************************************************
  677.  
  678. .Ready        rts                ;go back
  679.  
  680. *****************************************************************************
  681.  
  682. Inhibit        lea    Text99(pc),A1        ;get drive
  683.         move.l    A1,D1            ;set drive
  684.         moveq    #-1,D2            ;set flag (inhibit)
  685.         movea.l    DOSBase(A5),A6        ;set DOS to call a function
  686.         jsr    _LVOInhibit(A6)        ;use DOS to (inhibit)
  687.         tst.l    D0            ;check for inhibit
  688.         bne.b    .Ready            ;branch if so
  689.  
  690.         lea    TList0(pc),A0        ;set taglist
  691.         lea    Text53(pc),A1        ;set requester_text
  692.         lea    Text54(pc),A2        ;set gadget_text
  693.  
  694.         lea    Text99(pc),A3        ;get drivename
  695.         lea    Text31(pc),A4        ;get req_title #2
  696.         move.l    A4,ArgArray1(A5)    ;save ptr.
  697.         move.l    A3,ArgArray2(A5)    ;save ptr.
  698.         lea    ArgArray1(A5),A4    ;set argarray
  699.  
  700.         bsr    REQuest0        ;and request by reqtools
  701.         tst.l    D0            ;check for [retry]
  702.         bne.b    Inhibit            ;branch if so
  703.  
  704.         moveq    #1,D0            ;set returncode
  705.         move.l    D0,RCode(A5)        ;01 - drive in use
  706.  
  707.         addq    #4,SP            ;clear return_address
  708.         pea    CloseFile(pc)        ;set new one
  709.  
  710. .Ready        rts                ;go back / go loop
  711.  
  712. ************************************************ request (insert disk) ******
  713.  
  714. REQInsert    lea    TList0(pc),A0        ;set taglist
  715.         lea    Text51(pc),A1        ;set requester_text
  716.         lea    Text52(pc),A2        ;set gadget_text
  717.  
  718.         lea    Text99(pc),A4        ;get string
  719.         move.l    A4,ArgArray1(A5)    ;save ptr.
  720.         lea    ArgArray1(A5),A4    ;set argarray
  721.  
  722.         bsr    REQuest0        ;and request by reqtools
  723.         tst.l    D0            ;check for [cancel]
  724.         bne.b    .Ready            ;branch if so
  725.  
  726.         addq    #4,SP            ;clear return_address
  727.         pea    InitDrive(pc)        ;set new one
  728.  
  729. .Ready        rts                ;go back
  730.  
  731. ************************************************ error report (createport) **
  732.  
  733. Error10        movea.l    MessagePort(A5),A0    ;set msgport
  734.         jsr    _LVODeleteMsgPort(A6)    ;use EXEC to (deleteport)
  735.  
  736. Error09        moveq    #9,D0            ;set returncode - noport
  737.         lea    Text37(pc),A1        ;set requester_text
  738.  
  739.         addq    #4,SP            ;clear return_address
  740.         pea    ReqFail2(pc)        ;set new one
  741.         bra    REQuest1        ;request error
  742.  
  743. ************************************************ error report (writefile) ***
  744.  
  745. Error06        moveq    #4,D0            ;set returncode - open()
  746.         lea    Text34(pc),A1        ;set requester_text
  747.         bra    REQuest1        ;request error
  748.  
  749. Error07        moveq    #3,D0            ;set returncode - doio()
  750.         lea    Text36(pc),A1        ;set requester_text
  751.         lea    Text91(pc),A3        ;set insert_text
  752.         move.l    A3,ArgArray2(A5)    ;save ptr. (insert #2)
  753.         bra    REQuest2        ;request error
  754.  
  755. Error08        moveq    #2,D0            ;set returncode - write()
  756.         lea    Text35(pc),A1        ;set requester_text
  757.         lea    Text92(pc),A3        ;set insert_text
  758.         move.l    A3,ArgArray2(A5)    ;save ptr. (insert #2)
  759.         bra.b    REQuest2        ;request error
  760.  
  761. ************************************************ error report (opendevice) **
  762.  
  763. Error11        moveq    #11,D0            ;set rcode - no dosentry
  764.         lea    Text61(pc),A1        ;set requester_text
  765.         bra.b    REQuest4        ;request error
  766.  
  767. Error12        moveq    #12,D0            ;set rcode - unexpected dev.
  768.         lea    Text62(pc),A1        ;set requester_text
  769.         bra.b    REQuest4        ;request error
  770.  
  771. Error13        moveq    #13,D0            ;set rcode - wrong geometry
  772.         lea    Text63(pc),A1        ;set requester_text
  773.         bra.b    REQuest4        ;request error
  774.  
  775. Error05        moveq    #10,D0            ;set rcode - opendevice()
  776.         lea    Text32(pc),A1        ;set requester_text
  777.         bra.b    REQuest3        ;request error
  778.  
  779. *****************************************************************************
  780.  
  781. REQuest4    lea    Text99(pc),A3        ;set insert_text
  782.         move.l    A3,ArgArray2(A5)    ;save ptr. (insert #2)
  783.  
  784. REQuest3    addq    #4,SP            ;clear return_address
  785.         pea    ReqFail1(pc)        ;set new one
  786.         bra.b    REQuest1        ;request error
  787.  
  788. ************************************************ error report (readfile) ****
  789.  
  790. Error00        moveq    #5,D0            ;set returncode - open()
  791.         lea    Text34(pc),A1        ;set requester_text
  792.         bra.b    REQuest1        ;request error
  793.  
  794. Error01        moveq    #6,D0            ;set returncode - seek()
  795.         lea    Text33(pc),A1        ;set requester_text
  796.         pea    CloseFile(pc)        ;set return_address
  797.         bra.b    REQuest1        ;request error
  798.  
  799. Error02        moveq    #7,D0            ;set returncode - read()
  800.         lea    Text35(pc),A1        ;set requester_text
  801.         lea    Text91(pc),A3        ;set insert_text
  802.         move.l    A3,ArgArray2(A5)    ;save ptr. (insert #2)
  803.         bra.b    REQuest2        ;request error
  804.  
  805. Error03        moveq    #8,D0            ;set returncode - doio()
  806.         lea    Text36(pc),A1        ;set requester_text
  807.         lea    Text92(pc),A3        ;set insert_text
  808.         move.l    A3,ArgArray2(A5)    ;save ptr. (insert #2)
  809.         bra.b    REQuest2        ;request error
  810.  
  811. Error04        moveq    #8,D0            ;set returncode - doio()
  812.         lea    Text36(pc),A1        ;set requester_text
  813.         lea    Text93(pc),A3        ;set insert_text
  814.         move.l    A3,ArgArray2(A5)    ;save ptr. (insert #2)
  815. *        bra.b    REQuest2        ;request error
  816.  
  817. REQuest2    pea    InitDrive(pc)        ;set return_address
  818.  
  819. ************************************************ open error_requester *******
  820.  
  821. REQuest1    move.l    D0,RCode(A5)        ;set returncode
  822.         lea    TList0(pc),A0        ;set taglist
  823.         lea    Text39(pc),A2        ;set gadget_text
  824.  
  825.         lea    Text31(pc),A4        ;get req_title #2
  826.         move.l    A4,ArgArray1(A5)    ;save ptr.
  827.         lea    ArgArray1(A5),A4    ;set argarray
  828.  
  829. REQuest0    suba.l    A3,A3            ;no reqinfo
  830.         movea.l    REQBase(A5),A6        ;set REQ to call a function
  831.         jsr    _LVOrtEZRequestA(A6)    ;use REQ for (easyrequest)
  832.         rts                ;go back
  833.  
  834. ************************************************ alloc file_requester *******
  835.  
  836. AllocReq    moveq    #0,D0            ;want file_requester
  837.         suba.l    A0,A0            ;no tags yet
  838.         movea.l    REQBase(A5),A6        ;set REQ to call a function
  839.         jsr    _LVOrtAllocRequestA(A6)    ;use REQ to (allocrequest)
  840.         move.l    D0,FReqBase(A5)        ;save base
  841.         bne.b    .Ready            ;branch if ok
  842.  
  843.         moveq    #15,D0            ;set returncode
  844.         move.l    D0,RCode(A5)        ;15 - no file_requester
  845.  
  846.         addq    #4,SP            ;clear return_address
  847.  
  848. .Ready        rts                ;go back / quit program
  849.  
  850. ************************************************ change request attributes **
  851.  
  852. InitReq        lea    TList0(pc),A0        ;for pos. independent code
  853.         lea    Text11(pc),A1        ;for pos. independent code
  854.         move.l    A1,4(A0)        ;for pos. independent code
  855.  
  856.         lea    TList1(pc),A0        ;for pos. independent code
  857.         move.l    A1,4(A0)        ;for pos. independent code
  858.  
  859.         lea    TList2(pc),A0        ;for pos. independent code
  860.         lea    Text01(pc),A1        ;for pos. independent code
  861.         move.l    A1,4(A0)        ;for pos. independent code
  862.         lea    Text02(pc),A1        ;for pos. independent code
  863.         move.l    A1,12(A0)        ;for pos. independent code
  864.  
  865.         movea.l    FReqBase(A5),A1        ;set file_requester
  866.         movea.l    REQBase(A5),A6        ;set REQ to call a function
  867.         jsr    _LVOrtChangeReqAttrA(A6) use REQ to (changereqattr)
  868.         rts                ;go back
  869.  
  870. ************************************************ close file_requester *******
  871.  
  872. FreeReq        movea.l    FReqBase(A5),A1        ;set file_requester
  873.         movea.l    REQBase(A5),A6        ;set REQ to call a function
  874.         jsr    _LVOrtFreeRequest(A6)    ;use REQ to (freerequest)
  875.         rts                ;go back
  876.  
  877. ************************************************ open file_requester ********
  878.  
  879. GetFileName    movea.l    TList(A5),A0        ;set taglist
  880.         movea.l    FReqBase(A5),A1        ;set file_requester
  881.         lea    FileName(A5),A2        ;set buffer for filename
  882.         movea.l    ReqTitle(A5),A3        ;set requester_title
  883.         movea.l    REQBase(A5),A6        ;set REQ to call a function
  884.         jsr    _LVOrtFileRequestA(A6)    ;use REQ for (filerequest)
  885.         tst.l    D0            ;check for user input
  886.         bne.b    .Ready            ;branch if set
  887.  
  888.         addq    #4,SP            ;clear return_address
  889.         pea    ReqFail0(pc)        ;set new one
  890.  
  891. .Ready        rts                ;go back
  892.  
  893. ************************************************ set and reset current dir **
  894.  
  895. GetCDir        movea.l    FReqBase(A5),A1        ; get FREQBase
  896.         move.l    rtfi_Dir(A1),D1        ; set pathname
  897.         moveq    #ACCESS_READ,D2        ; set mode
  898.         movea.l    DOSBase(A5),A6        ; set DOS to use a function
  899.         jsr    _LVOLock(A6)        ; use DOS to (lock) directory
  900.         move.l    D0,D1            ; set directory lock
  901.         jsr    _LVOCurrentDir(A6)    ; use DOS to set (currentdir)
  902.         move.l    D0,DLock(A5)        ; save prev. directory lock
  903.         rts                ; go back
  904.  
  905. ************************************************
  906.  
  907. ResetCDir    move.l    DLock(A5),D1        ; set prev. directory lock
  908.         movea.l    DOSBase(A5),A6        ; set DOS to use a function
  909.         jsr    _LVOCurrentDir(A6)    ; use DOS to set (currentdir)
  910.         move.l    D0,D1            ; set returned lock
  911.         jsr    _LVOUnLock(A6)        ; use DOS to (unlock) dir.
  912.         rts                ; go back
  913.  
  914. *****************************************************************************
  915.  
  916. TList0        dc.l    RTEZ_ReqTitle,0,RTEZ_Flags,EZREQF_CENTERTEXT,0
  917. TList1        dc.l    RTEZ_ReqTitle,0,RTEZ_Flags,EZREQF_CENTERTEXT!EZREQF_NORETURNKEY,0
  918. TList2        dc.l    RTFI_Dir,0,RTFI_MatchPat,0,0
  919. TList3        dc.l    RTFI_Flags,FREQF_PATGAD,0
  920. TList4        dc.l    RTFI_Flags,FREQF_PATGAD!FREQF_SAVE,0
  921.  
  922. *****************************************************************************
  923.  
  924. Device0        dc.b    "trackdisk.device",0
  925. Device1        dc.b    "fmsdisk.device",0
  926.  
  927. Text01        dc.b    "RAM:",0
  928. Text02        dc.b    "(#?.dim|#?.adf|#?)",0
  929. Text03        dc.b    "Read Image from...",0
  930. Text04        dc.b    "Save Image as...",0
  931.  
  932. Text11        dc.b    "Image2Disk V1.0",0
  933.  
  934. Text12        dc.b    "IMAGE-FILE --> DISK --> IMAGE-FILE",$A
  935.         dc.b    "----------------------------------------------",$A
  936.         dc.b    "for all standard diskdrives 880/KB",$A
  937.         dc.b    "controlled either by the trackdisk.- or fmsdisk.device",$A
  938.         dc.b    "--------------------------------------------------------",$A
  939.         dc.b    "written by Joerg Riemer jan'98",$A
  940.         dc.b    "email: mission@cs.tu-berlin.de",0
  941.  
  942. Text13        dc.b    "  Verify [ ]  |Image --> Disk|Disk --> Image|     Quit     ",0
  943.  
  944. Text21        dc.b    "Select Device",0
  945. Text22        dc.b    "DFx Unit|DFx Unit|DFx Unit|DFx Unit| Cancel ",0
  946.  
  947. Text23        dc.b    "Select Unit",0
  948. Text24        dc.b    "DF0|DF1|DF2|DF3|Cancel",0
  949.  
  950. Text31        dc.b    "ERROR!!!",0
  951.  
  952. Text32        dc.b    "%s",$A,"Can't open %s for suggested drive.",0
  953. Text33        dc.b    "%s",$A,"Required length of Image-File is wrong.",0
  954. Text34        dc.b    "%s",$A,"Can't open suggested Image-File.",0
  955. Text35        dc.b    "%s",$A,"While %s Image-File.",0
  956. Text36        dc.b    "%s",$A,"While %s track.",0
  957. Text37        dc.b    "%s",$A,"Can't create MsgPort/IORequest!!",$A,"Please, try to free some memory.",0
  958.  
  959. Text61        dc.b    "%s",$A,"Can't find %s",$A,"(suggested drive not mounted)",0
  960. Text62        dc.b    "%s",$A,"%s controlled by an unexpected device.",0
  961. Text63        dc.b    "%s",$A,"Drive-Geometry used by %s not supported.",0
  962.  
  963. Text39        dc.b    " Cancel ",0
  964.  
  965. Text41        dc.b    "Image-File transfer %s",0
  966. Text42        dc.b    " Get another one  |       Quit       ",0
  967.  
  968. Text51        dc.b    "Insert disk in drive %s",$A
  969.         dc.b    "Click [Ok] or press <RETURN> to continue...",0
  970. Text52        dc.b    "   Ok   | Cancel ",0
  971.  
  972. Text53        dc.b    "%s",$A,"Can't access %s",$A,"(suggested drive in use)",0
  973. Text54        dc.b    " Retry | Cancel ",0
  974.  
  975. Text91        dc.b    "reading",0
  976. Text92        dc.b    "writing",0
  977. Text93        dc.b    "verifying",0
  978.  
  979. Text94        dc.b    "successful!!!",0
  980. Text95        dc.b    "failed!!!",0
  981. Text96        dc.b    "canceled by user!!!",0
  982.  
  983. Text99        dc.b    "DF0:",0
  984.  
  985. *****************************************************************************
  986.  
  987.         if    BSS_Section
  988.  
  989.         SECTION    Image2Disk_bss,BSS
  990.  
  991.         elseif
  992.  
  993.         cnop    0,4
  994.  
  995.         endc
  996.  
  997. *****************************************************************************
  998.  
  999. DataBase    ds.b    BSS_Size
  1000.  
  1001.  end of source **************************************************************
  1002.